using IQIGame.Onigao.Logic;

namespace IQIGame.Onigao.GamePlay
{
    /// <summary>
    /// 动态配置键
    /// 指向一个唯一的值，这个值可能是固定的，也可能是从实体身上的动态参数映射里获取的
    /// 该类用于重用配置
    /// （比如关卡里的服务配置，当需要配置实体id时，统一使用DynCfgKey类型进行配置。
    /// 假如有一个需求，和机关交互，打开机关对应的门，那么此时机关可以配同一个服务，服务里门都使用动态id，key == "door"，
    /// 当这个服务被挂到不同机关身上时，每个机关上动态参数映射中都会有一个"door"对应的门id，虽然每个机关都会打开不同的门，
    /// 但他们可以挂同一个开门服务，门的id其实是被放在机关自己身上的）
    /// </summary>
    public partial struct DynCfgKey
    {
        /// <summary>
        /// 是否动态获取
        /// </summary>
        public bool isDynamic;
        /// <summary>
        /// 固定id
        /// </summary>
        public int fixedKey;
        /// <summary>
        /// 动态获取id的键
        /// </summary>
        public string dynamicKey;

        public bool TryGetValue(LevelEntity entity, out int key)
        {
            if (!isDynamic)
            {
                key = fixedKey;
                return true;
            }
            var dynParamDict = entity?.entityConfig.serviceDynamicParam;
            if (dynParamDict != null && dynParamDict.TryGetValue(dynamicKey, out int dynKeyValue))
            {
                key = dynKeyValue;
                return true;
            }
            key = 0;
            return false;
        }

        public override string ToString()
        {
            return $"isDynamic: {isDynamic}, fixedKey: {fixedKey}, dynamicKey: {dynamicKey}";
        }
    }
}
